1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| #include<iostream> #include<cstdio> #include<cstring> #include<cctype> #include<algorithm> #include<cmath> using namespace std; inline int read(){ int w=0,x=0;char c=getchar(); while(!isdigit(c))w|=c=='-',c=getchar(); while(isdigit(c))x=(x<<3)+(x<<1)+(c^48),c=getchar(); return w?-x:x; } namespace star { const int maxn=3e5+10; int n,a[maxn]; int log[maxn]; int l[20][maxn],r[20][maxn]; struct RMQ{ int st[maxn][20],val[maxn]; int op; inline int MAX(int x,int y){ return val[x]>val[y]?x:y; } inline void build(int *b,int n,int _op){ op=_op; for(int i=1;i<=n;i++) st[i][0]=i,val[i]=op*b[i]; for(int j=1;j<=log[n];j++) for(int i=1;i<=n;i++) st[i][j]=MAX(st[i][j-1],st[i+(1<<(j-1))][j-1]); } inline int query(int l,int r){ int k=log[r-l+1]; return MAX(st[l][k],st[r-(1<<k)+1][k]); } }L,R; inline void work(){ n=read(); if(n==1)return (void)puts("0"); for(int i=2;i<=3*n;i++) log[i]=log[i>>1]+1; for(int i=1;i<=n;i++) a[i]=a[i+n]=a[i+n+n]=read(); for(int i=0;i<=log[3*n];i++) l[i][1]=1,r[i][n*3]=3*n; for(int i=1;i<=3*n;i++) l[0][i]=max(1,i-a[i]),r[0][i]=min(n*3,i+a[i]); L.build(l[0],3*n,-1),R.build(r[0],3*n,1); for(int l1,r1,j=1;j<=log[3*n];j++) for(int i=1;i<=3*n;i++){ l1=L.query(l[j-1][i],r[j-1][i]); r1=R.query(l[j-1][i],r[j-1][i]); l[j][i]=min(l[j-1][l1],l[j-1][r1]); r[j][i]=max(r[j-1][l1],r[j-1][r1]); } for(int i=n+1;i<=n<<1;i++){ int u=i,v=i,ans=0; for(int j=log[n*3];~j;j--) if(max(r[j][u],r[j][v])-min(l[j][u],l[j][v])+1<n){ int su=L.query(l[j][u],r[j][v]),sv=R.query(l[j][u],r[j][v]); u=su,v=sv; ans+=(1<<j); } printf("%d ",ans+1); } } } signed main(){ star::work(); return 0; }
|